package com.itheima.consumer.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 正常消息队列的配置类：
 *    将正常队列和死信交换机进行绑定，实现延迟消息。
 *
 * 消息运转整体流程：
 *    1.需要延迟的消息发送到正常交换机 normalExchange，
 *    2.正常交换机到达正常队列 normalQueue，由于正常队列没有消费者，所以到达过期时间以后，消息会变成死信。
 *    3.死信消息会投递到死信交换机 dlx.direct。
 *    4.死信交换机到达死信队列 dlxQueue。
 *    5.到达消费者后，消费者进行消费。
 */
// 通过配置类来声明队列和交换机，队列和交换机的声明一般是在消费者中。
@Configuration
public class NormalConfiguration {

    // 1.定义一个Spring配置类中的Bean方法，用于创建并返回一个RabbitMQ的广播式交换器（Fanout Exchange）
    @Bean
    public DirectExchange normalExchange() {
        return new DirectExchange("normal.direct");
    }

    // 2.定义Queue的Bean方法，创建并返回一个RabbitMQ的队列
    /**
     * 给正常的队列设定一个死信交换机，这样当队列中的消息过期时，消息会进入死信队列中，实现延迟消费。
     * 该正常队列没有消费者，而是绑定一个死信交换机。
     */
    @Bean
    public Queue directNormalQueue() {
//        return new Queue("normal.queue");
        return QueueBuilder
                .durable("normal.queue")        // 设置队列持久化
                .deadLetterExchange("dlx.direct") // 设置死信交换机
                .build();                             // 创建并返回一个RabbitMQ的队列
    }

    @Bean
    public Binding normalExchangeBinding(Queue directNormalQueue, DirectExchange normalExchange) {
        return BindingBuilder.bind(directNormalQueue).to(normalExchange).with("hi");
    }
}
